//
// Created by LiuYou on 2021/10/29.
//

#include <iostream>
#include <unistd.h>
#include <cstring>


static const int LEFT = 30000000;
static const int RIGHT = 30000200;
static const int THREAD_NUM = RIGHT - LEFT + 1;


static void* startRoutine(void* args) {


    pthread_exit( nullptr );
}


/**
 * @brief 使用线程重构。
 * @details 如果一个数只能由 1 和 它本身 能够被它 整除的话, 那么这个数就是质数。
 *
 * <p>运行这个程序能观察到CPU的一个核的利用率会一下子飙升占满整个核。
 *
 *
 * <p> 每有一个待计算的 i 值, 就用一个线程来计算。
 * 所以, 应该把 内部 for循环 设计为一个独立的函数。
 *
 * @param argc
 * @param argv
 * @return
 */
int main(int argc, char** argv) {

    pthread_t tidArray[THREAD_NUM]{};
    for (int i = 0; i < THREAD_NUM; ++i) {
        int errorNumber = pthread_create( tidArray + i, nullptr, startRoutine, nullptr );
//        int errorNumber = pthread_create( tidArray + i, nullptr, [](void* args) -> void* {
//
//            pthread_exit( nullptr );
//        }, nullptr );

        // 一般情况下是不会出错的。
        if (errorNumber != 0) {
            fprintf( stderr, "pthread_create(): %s.\n", strerror(errno));
            return 1;
        }
    }


    for (int i = 0; i < THREAD_NUM; ++i) {
        pthread_join( tidArray[i], nullptr );
    }


    int mark{};
    for (int i = LEFT; i < RIGHT; ++i) {
        mark = 1;
        for (int j = 2; j < i / 2; ++j) {
            if (i % j == 0) {
                mark = 0;
                break;
            }
        }
        if (mark == 1) {
            printf( "%d 是一个质数。\n", i );
        }
    }


    return 0;
}
